import 'package:get/get.dart';
import 'package:logger/logger.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimSDKListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/log_level_enum.dart';
import 'package:tencent_cloud_chat_sdk/manager/v2_tim_manager.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:vischat/core/config/app_config.dart';
import 'package:vischat/core/utils/tencent/generate_user_sig.dart';
import 'package:vischat/data/datasources/local/secure_local.dart';
import 'package:vischat/data/models/user_model.dart';

/// 腾讯IM
class TencentInit {
  static final V2TIMManager _v2timManager = TencentImSDKPlugin.v2TIMManager;

  static final Logger _logger = Get.find();


  /// 初始化sdk
  static Future<void> initSDK() async {
    // 1. 添加 V2TimSDKListener 的事件监听器，sdkListener 是 V2TimSDKListener 的实现类
    V2TimSDKListener sdkListener = V2TimSDKListener(
      onConnectFailed: (int code, String error) {
        // 连接失败的回调函数
        // code 错误码
        // error 错误信息
        _logger.i('腾讯服务器连接失败：$code=>$error');
      },
      onConnectSuccess: () {
        // SDK 已经成功连接到腾讯云服务器
        _logger.i('腾讯服务器连接成功');
      },
      onConnecting: () {
        // SDK 正在连接到腾讯云服务器
        _logger.i('腾讯服务器连接中...');
      },
      onKickedOffline: () {
        // 当前用户被踢下线，此时可以 UI 提示用户，并再次调用 V2TIMManager 的 login() 函数重新登录。
        _logger.i('im用户被踢下线');
      },
      onSelfInfoUpdated: (V2TimUserFullInfo info) {
        // 登录用户的资料发生了更新
        // info登录用户的资料
        _logger.i('im用户信息变更');
      },
      onUserSigExpired: () async {
        // 在线时票据过期：此时您需要生成新的 userSig 并再次调用 V2TIMManager 的 login() 函数重新登录。
        _logger.i('im用户登录过期');
        await loginIM();
      },
      onUserStatusChanged: (List<V2TimUserStatus> userStatusList) {
        //用户状态变更通知
        //userStatusList 用户状态变化的用户列表
        //收到通知的情况：订阅过的用户发生了状态变更（包括在线状态和自定义状态），会触发该回调
        //在 IM 控制台打开了好友状态通知开关，即使未主动订阅，当好友状态发生变更时，也会触发该回调
        //同一个账号多设备登录，当其中一台设备修改了自定义状态，所有设备都会收到该回调
        _logger.i('im用户登状态变更');
      },
    );

    // 2.初始化SDK
    V2TimValueCallback<bool> initSDKRes = await _v2timManager.initSDK(
      sdkAppID: AppConfig.tencent_sdkAppId, // SDKAppID
      loglevel: LogLevelEnum.V2TIM_LOG_ALL, // 日志登记等级
      listener: sdkListener, // 事件监听器
    );
    if (initSDKRes.code == 0) {
      //初始化成功
      _logger.i('腾讯SDK初始化成功');
      loginIM();
    }
  }

  /// 登录
  static Future<void> loginIM() async {
    UserModel? user = Get.find<SecureLocal>().getUser();
    if (user != null && user.userId != null) {
      String userSig = GenerateTestUserSig.genSig(userId: user.userId!);
      V2TimCallback res = await _v2timManager.login(
        userID: user.userId!,
        userSig: userSig,
      );
      if (res.code == 0) {
        // 登录成功逻辑 登录成功会自动同步会话列表
        _logger.i('腾讯登录成功');
      } else {
        // 登录失败逻辑
        _logger.i('腾讯登录失败');
      }
    }
  }

  /// 获取登录状态
  static Future<void> getLoginStatus() async {
    // 在用户登录成功之后可调用
    // 调用getLoginStatus获取登录成功的用户的状态
    V2TimValueCallback<int> getLoginStatusRes =
        await _v2timManager.getLoginStatus();
    if (getLoginStatusRes.code == 0) {
      int? status = getLoginStatusRes.data; // getLoginStatusRes.data为用户登录状态值
      if (status == 1) {
        // 已登录
      } else if (status == 2) {
        // 登录中
      } else if (status == 3) {

      }
    }
  }
}
